package com.zwh.se.constant_variable_operator;

/**
 * 变量，表示在程序运行过程中值，值会发生改变的量。
 * 定义语法：数据类型 变量名 [=初始值] [,变量名  [=初始值]…]; //[ ]中的内容为可选项，即可有可无
 * <p>
 * 本质上是一块"存储空间区域",可用来存放、修改或者获取某一类型的常量数据,没有固定值,并可以重复使用。
 * <p>
 * 声明一个变量时,变量就会占据内存中的某一块存储区域,同时该区域有自己的名称(变量名)和类型(数据类型),这样计算机就能辨别你,知道你是谁
 * 同时该区域可以被重复使用,该区域的数据可以在同一类型范围内不断变化
 * <p>
 * 而数据类型则是告知jvm要开辟多大的存储空间，数据类型表示存储空间（理解方式，想象是一个变量去住房，开多大的房间）
 *
 * @author yexi
 */
public class Variable {
    public static void main(String[] args) {

        //[1]声明一个int类型的变量。在这个变量刚被声明时是没有默认值的，它需要初始化(也就是赋予初始值的意思)后才可以使用。
        //  如果你只定义一个变量，没有给变量进行赋值的话，那么这个变量相当于没有定义
        int age;
        //  变量如果没有进行赋值就使用的话就会出现编译错误。并且编译器也会提示你：尚未初始化
        //System.out.println(age);
        //[2]给变量赋初始值,把20这个常量赋值（=）给一个叫做age的内存空间
        age = 20;
        //计算机会帮你把20转成二进制后再保存
        //然后因为是int类型所以实际存储的是00000000 00000000 00000000 00010100
        //[3]使用变量
        System.out.println(age);
        //变量在程序运行过程中，内容中的值可以变化
        age = 28;
        System.out.println(age);
        //总结：变量必须先声明后再使用

        //声明和赋值合二为一
        int money = 10;
        System.out.println(money);
        //注意的是，同一作用域内，变量名不能重复定义。
        //举例：编译错误,因为该变量已经被命名过了,不能定义同名变量
        //int money = 100;

        //在一行中可以定义多个变量，但一般不推荐(相对而言的可读性会变差)，每个变量最好单独放一行
        int abc = 4, efg = 5;

        //声明各种数据类型的变量
        //整形
        byte a = 127;
        short b = 32767;
        int c = 2100000000;
        long d = 10L;
        //小数
        float e = 3.14f;
        double f = 3.14d;
        double g = 124124;//输入整数的话会自动补充后面的.0
        //字符
        char h = 'A';
        //布尔类型
        boolean t = true;
        //String字符串类型
        String name = "张二狗";

        //如果变量使用final关键字所修饰，那么该变量就可以称之为常量或者叫做最终常量，同时这个常量的值将不可再变化
        // 这种使用final修饰修饰的变量变成的常量，学名将之称作"符号常量"
        // 约定俗成的规定：符号常量的名字全部大写
        final int CONSTANT = 20;
        //CONSTANT = 40;

        //变量的命名规范：
        //硬性规定(不遵守就会报错)：
        // 1、标识符必须以字母，下划线或者美元符号开头
        // 2、其他部分必须是字母，数字，下划线或者美元符号，但是不能出现特殊符号
        // 3、标识符大小写敏感
        // 4、不能是java的关键字或者保留字（留给系统使用的表示特殊含义的字符串）
        // 举例:
        int _a = 10;
        int _A = 10;
        int $b = 20;
        int 数字10 = 10;
        //int a + b = 30;  +号是关键字
        //int 1count；  以数字开头会直接编译失败(原因:编译器先解析到数字会认为你是想用一个常量,而不是打算为变量命名)
        //建议规范：
        // 1、满足驼峰命名法
        // (所谓驼峰命名法,指的是类名、接口名首字符要大写,方法名、变量名首字符要小写,而其余部分的若每个单词有对应特殊意思,那么针对每个单词首字符都大写)
        // 2、见名知意(比如上面的部分命名就是反例)
        // 3、最好不要使用拼音
        // 举例：声明一个变量来表示班级人数，再声明一个用钱买东西的变量
        int classCount;
        int getThingByMoney;

        // 变量的作用域:
        //变量从开始定义到所在的花括号结束之内可以使用，离开花括号就不能使用了(这个花括号就是所谓的作用域)
        //作用域指的就是作用范围，变量在什么范围中有效
        {
            int haha = 6;
        }
        //haha = 8;

        //以上这些概念都针对于Java语言是一门强类型的语言而存在。
        //强类型：1.所有的变量必须先显式的声明类型后才可以使用；2.指定类型的变量只能接受类型与之匹配的值。 比如java,c++
        //弱类型：变量会根据值自己去推断，不需要指定类型是什么	比如js,python,scala
    }

}
